﻿#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    setWindowTitle("绘制圆形滚动条");
    setMinimumSize(225,268);
    getRectInfo();
}

Widget::~Widget()
{
    delete ui;
}

void Widget::paintEvent(QPaintEvent *e)
{
    Q_UNUSED(e);
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    drawOutBar(painter);
    drawInBar(painter);
    drawPoint(painter);
    drawText(painter);
}

void Widget::resizeEvent(QResizeEvent *event)
{
    Q_UNUSED(event);
    ui->horizontalSlider->move(20,height()-ui->horizontalSlider->height());
    getRectInfo();
    update();
}

// 计算绘制各圆的起点位置
void Widget::getRectInfo()
{
    minW = qMin(width(),ui->horizontalSlider->y()-5);
}

// 画外圈
void Widget::drawOutBar(QPainter &p)
{
    p.setPen(QPen(QColor(51, 102, 255),BarWidth));
    p.drawEllipse(BarWidth,BarWidth,minW-2*BarWidth,minW-2*BarWidth);
}

// 画内圆
void Widget::drawInBar(QPainter &p)
{
    QPen pen;
    pen.setWidth(BarWidth);
    QLinearGradient gradient(BarWidth,BarWidth,minW,minW);
    gradient.setColorAt(0,QColor(255, 51, 153));
    gradient.setColorAt(1,QColor(51, 255, 255));
    pen.setBrush(QBrush(gradient));
    pen.setCapStyle(Qt::RoundCap);                     // 形状：圆角
    pen.setStyle(Qt::SolidLine);
    pen.setJoinStyle(Qt::RoundJoin);
    p.setPen(pen);
    QRectF rect = QRectF(BarWidth,BarWidth,minW-2*BarWidth,minW-2*BarWidth);
    int startAngle = 92*16;                            // 起始角度位置，正上方偏左一点
    float spanAngle = value * 360 / 100 * 16 * -1;     // 负数为顺时针，正数为逆时针
    p.drawArc(rect,startAngle,spanAngle);              // 画圆弧
}

// 画上方圆点
void Widget::drawPoint(QPainter &p)
{
    p.setPen(QPen(Qt::white,6));
    p.drawEllipse(minW/2,BarWidth-2,6,6);
}

// 画文字
void Widget::drawText(QPainter &p)
{
    QString str_value = QString("%1%").arg(value);
    p.setPen(QPen(QColor(49, 177, 190)));
    QFont font("Microsoft YaHei UI",32);
    p.setFont(font);
    QFontMetrics fm(font);
    int w= fm.width(str_value);
    p.drawText(minW/2-w/2,minW/2,str_value);
}

// 改变值
void Widget::on_horizontalSlider_valueChanged(int value)
{
    this->value = value;
    update();
}
